package br.com.pguide.activity;

import java.util.ArrayList;

import br.com.pguide.R;
import br.com.pguide.estrutura.ItemEstabelecimento;
import br.com.pguide.parser.Parser;
import br.com.pguide.utils.GeoUtils;
import br.com.pguide.utils.Mensagem;
import br.com.pguide.webservice.WebService;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class ListaDeResultadosBuscaItem extends ListActivity {

	private ActivityList listAdapter;
	private ArrayList<ItemEstabelecimento> lista;
	String username;
	int id_item;
	String[] estabelecimentos;
	LocationManager locationManager;
	double latitude, longitude;
	String provider;
	public static double EARTH_RADIUS_KM = 6367.43;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		getListView().setBackgroundDrawable(getResources().getDrawable(R.drawable.common_background));

		Intent it = getIntent();
		id_item = it.getIntExtra("id_item", -1);
		username = it.getStringExtra("username");

		getLocation();
		if (id_item == -1) { // busca de recomendação para uma lista de compras
			lista = Parser.busca_recomendacao_lista(WebService.busca_recomendacao_lista(username, latitude, longitude), username, this);
		} else { // busca de recomendação para um item específico
			lista = Parser.busca_recomendacao_produto_unico(WebService.busca_recomendacao_produto_unico(username, id_item, latitude, longitude), username, this);
		}

		estabelecimentos = new String[lista.size()];
		for (int i=0; i<lista.size(); i++) {
			estabelecimentos[i] = "";
		}

		atualizar(lista, estabelecimentos);
	}

	public void atualizar(ArrayList<ItemEstabelecimento> itens, String[] estabelecimentos) {

		listAdapter = new ActivityList(ListaDeResultadosBuscaItem.this, android.R.id.text1, itens, estabelecimentos);

		setListAdapter(listAdapter);
		ListView lv = getListView();
		lv.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {

				String uri = "http://maps.google.com/maps?saddr=" + latitude+","+longitude+"&daddr="+lista.get(position).getEstabelecimento().getLatitude()+","+lista.get(position).getEstabelecimento().getLongitude();
				Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri));
				intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
				startActivity(intent);
			}
		});
	}

	public void onItemClick(int position) {

	}

	public void getLocation() {
		if (android.os.Build.DEVICE.equals("sdk") || android.os.Build.DEVICE.equals("generic")) {
			// modo de desenvolvimento - sdk
			this.latitude = -9.4157852;
			this.longitude = -36.6223826;
			return;
		}

		habilitarGPS();
		// Get the location manager
		LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		// Define the criteria how to select the locatioin provider -> use
		// default
		Criteria criteria = new Criteria();
		String provider = locationManager.getBestProvider(criteria, false);
		Location location = locationManager.getLastKnownLocation(provider);
		if (location != null) {
			this.latitude = (double) (location.getLatitude());
			this.longitude = (double) (location.getLongitude());
		} else {
			Mensagem.exibirMensagem("Latitude is not available" +
					"\nLongitude is not available", this);
		}
	}

	public void habilitarGPS() {
		// a classe LocationManager provê o acesso ao serviço de localização do Android
		LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
		boolean enabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER);

		if (!enabled) {
			/* o GPS não pode ser habilitado diretamente em código
			 ** o usuário precisa autorizar a sua habilitção
			 ** apenas a Activity do Google Map habilita automaticamente o GPS */
			Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
			startActivity(intent);
		}
	}

	public void refreshLocation(int position){
		try {
			ItemEstabelecimento item = lista.get(position);
			double distancia = GeoUtils.geoDistanceInKm(latitude, longitude,
					item.getEstabelecimento().getLatitude(), item.getEstabelecimento().getLongitude());
			item.setDistancia(distancia);
		} catch (Exception e) {
			Mensagem.exibirMensagem(e.getMessage().toString(), this);
		}

	}

	public void onLocationChanged(Location location) {
		latitude = location.getLatitude();
		longitude = location.getLongitude();
	}

	class ActivityList extends ArrayAdapter<String> {

		ArrayList<ItemEstabelecimento> lista = null;

		public ActivityList(Context context, int textViewResourceId, ArrayList<ItemEstabelecimento> lista, String[] estabelecimentos) {
			super(context, textViewResourceId, estabelecimentos);
			this.lista = lista;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder;
			if(convertView == null){
				LayoutInflater inflater = LayoutInflater.from(ListaDeResultadosBuscaItem.this);
				convertView = inflater.inflate(R.layout.lista_recomendacao_estabelecimentos, parent, false);
				holder = new ViewHolder();

				holder.pontuacao = (TextView) convertView.findViewById(R.id._pontuacao_recomendacao);
				holder.estabelecimento = (TextView) convertView.findViewById(R.id._estabelecimento);
				holder.endereco = (TextView) convertView.findViewById(R.id._endereco);
				holder.cidade = (TextView) convertView.findViewById(R.id._cidade);
				holder.estado = (TextView) convertView.findViewById(R.id._estado);
				holder.distancia = (TextView) convertView.findViewById(R.id._distancia);
				holder.preco_unitario = (TextView) convertView.findViewById(R.id._preco_unitario);
				holder.desconto = (TextView) convertView.findViewById(R.id._desconto);
				holder.preco_final = (TextView) convertView.findViewById(R.id._preco_final);

				convertView.setTag(holder);
			} else{
				holder = (ViewHolder) convertView.getTag();
			}
			holder.pontuacao.setText(lista.get(position).getPontuacao()+"%");
			holder.estabelecimento.setText(lista.get(position).getEstabelecimento().getNome_curto());
			holder.endereco.setText(lista.get(position).getEstabelecimento().getEndereco());
			holder.cidade.setText(lista.get(position).getEstabelecimento().getCidade());
			holder.estado.setText("/" + lista.get(position).getEstabelecimento().getEstado());
			if (id_item==-1) { // recomendação de lista de compras
				holder.desconto.setText("");
				holder.preco_unitario.setText(getString(R.string.preco_total) + ": ");
				holder.preco_final.setText("R$ " + String.format("%.2f", lista.get(position).getPreco()));
			} else { // recomendação de um item
				holder.desconto.setText(" - " + lista.get(position).getDesconto()+"% = ");
				holder.preco_unitario.setText(getString(R.string.preco) + ": R$ " + String.format("%.2f", lista.get(position).getPreco()));
				holder.preco_final.setText("R$ " +    String.format("%.2f", (lista.get(position).getPreco() * (100-lista.get(position).getDesconto())/100)));
			}

			refreshLocation(position);
			holder.distancia.setText(getString(R.string.distancia) + String.format(": %.1f km", lista.get(position).getDistancia()));

			return convertView;
		}
	}

	static class ViewHolder{
		TextView pontuacao;
		TextView estabelecimento;
		TextView endereco;
		TextView cidade;
		TextView estado;
		TextView distancia;
		TextView preco_unitario;
		TextView desconto;
		TextView preco_final;
	}
}
